#include "kaoqinsys.h"
#include "ui_kaoqinsys.h"

/* 调试 - 头文件. */
#include <QDebug>

/* 处理JSON数据 */
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonDocument>

/* 消息框 */
#include <QMessageBox>

/* 文件类 */
#include <QFile>

KaoQinSys::KaoQinSys(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::KaoQinSys)
{
    ui->setupUi(this);

    /* 修改标题 */
    setWindowTitle("智能考勤系统");

    /* 修改软件图标 */
    QIcon icon(":/Icons/blackCat.png");
    setWindowIcon(icon);


    /* 绑定信号和槽 */
    connect(ui->enterBtn, &QPushButton::clicked, this, &KaoQinSys::handleEnterInfoSlot);
    connect(ui->delBtn, &QPushButton::clicked, this, &KaoQinSys::handleDelInfoSlot);
    connect(ui->searchBtn, &QPushButton::clicked, this, &KaoQinSys::handleSearchInfoSlot);

    connect(ui->enterInfoBtn, &QPushButton::clicked, this, &KaoQinSys::handleRecordInfoSlot);
    connect(ui->clearBtn, &QPushButton::clicked, this, &KaoQinSys::handleClearContextSlot);

    connect(ui->delSearchBtn, &QPushButton::clicked, this, &KaoQinSys::handleSearchDelSlot);
    /* 配置文件的绝对路径 */
    m_userInfoPath = "D:\\KaoQinSystem\\GitTest\\KaoQinSystem\\KaoQinSystem\\userInfo.json";

    /* 加载配置文件 */
    loadAppointConfigFile(m_userInfoPath);
}


/* 根据用户名找到对应的卡号 */
QStringList KaoQinSys::accordUserToCard(const QString & username)
{

}


/* 根据卡号删除对应的用户信息 */
void KaoQinSys::delUserAccordAppointCard(const QString & cardId)
{
    /* 删除卡号 */
    User * delUser = m_mapInfo[cardId];

    qDebug() << "del Name:" << delUser->getUserName();
    qDebug() << "del Hostel:" << delUser->getUserHostel();
    qDebug() << "del Sex:" << delUser->getUserSex();


    /* 哈希表删除指定的卡号 */
    m_mapInfo.remove(cardId);
}

/* 查询删除信息 - 槽函数 */
void KaoQinSys::handleSearchDelSlot()
{
    if (ui->delCardId->text() == "" && ui->delUserName->text() == "")
    {
        QMessageBox::warning(this, "删除信息", "至少填写一项");
        return;
    }

    QString cardId = ui->delCardId->text();
    /* 要么填写卡号 要么填写用户名. */
    if (cardId == "")
    {
        /* 没有填写卡号 */

        /* 要删除的用户名 */
        QString delUserName = ui->delUserName->text();

        /* 根据用户名得到同名的所有卡号 (卡号列表). */
        QStringList cardList = accordUserToCard(delUserName);

    }
    else
    {
        /* 填写了卡号 */
        if (m_mapInfo.contains(cardId) == true)
        {
            /* 根据卡号删除对应的用户信息 */
            delUserAccordAppointCard(cardId);
        }
        else
        {
            QMessageBox::warning(this, "删除信息", "没有对应的卡号");
            return;
        }

    }
}



/* 加载默认的配置文件 */
void KaoQinSys::loadAppointConfigFile(QString filePath)
{
    /* 打开文件 */
    QFile file(filePath);
    if (file.open(QIODevice::ReadOnly) == false)
    {
        QMessageBox::warning(this, "打开文件", "文件打开失败");
        return;
    }
    /* 程序到这个地方: 配置文件一定存在 */
    QByteArray fileContent = file.readAll();

    /* 关闭文件 */
    file.close();


    /* 解析Json文档 */
    QJsonDocument jsonDoc = QJsonDocument::fromJson(fileContent);


    /* 获取Json数据 */
    QJsonArray jsonArr = jsonDoc.array();


    for (const QJsonValue & value : jsonArr)
    {
        if (value.isObject() == false)
        {
            continue;
        }

        /* 程序到这边: value是QJsonObject */
        QJsonObject jsonObj = value.toObject();

        /* 哈希表的Key. */
        QString cardId = jsonObj["cardId"].toString();
        /* 哈希表的Value. */
        User * tmp = new User();
        tmp->setUserName(jsonObj["username"].toString());
        tmp->setUserSex(jsonObj["sex"].toString());
        tmp->setUserHostel(jsonObj["hostelId"].toString());

        m_mapInfo.insert(cardId, tmp);
    }

}

/* 清空文本框内容 - 槽函数 */
void KaoQinSys::handleClearContextSlot()
{
    /* 清空文本框内容 */
    ui->cardId->clear();
    ui->userName->clear();
    ui->hostelId->clear();
    ui->sex->clear();
}


/* 录入学生信息 - 槽函数 */
void KaoQinSys::handleRecordInfoSlot()
{
    if (ui->cardId->text() == "" || ui->userName->text() == "" || ui->hostelId->text() == "" || ui->sex->text() == "")
    {
        QMessageBox::warning(this, "信息录入", "有未填信息");
        return;
    }

    /* 卡号 */
    QString cardId = ui->cardId->text();
    /* 姓名 */
    QString username = ui->userName->text();
    /* 宿舍号 */
    QString hostelId = ui->hostelId->text();
    /* 性别 */
    QString sex = ui->sex->text();

    qDebug() << "cardId:" << cardId;
    qDebug() << "username:" << username;
    qDebug() << "hostelId:" << hostelId;
    qDebug() << "sex:" << sex;


    User * newUser = new User();
    newUser->setUserName(username);
    newUser->setUserHostel(hostelId);
    newUser->setUserSex(sex);

    /* 将用户信息和卡号一一映射 */
    m_mapInfo.insert(cardId, newUser);


    QMessageBox::information(this, "信息录入", "录入信息成功");
#if 1
    /* 文件系统里面 */

#endif
}

/* 保存用户的映射信息 */
void KaoQinSys::saveUserMapInfo()
{
    /* 创建Json数组 */
    QJsonArray jsonArray;

    auto iter = m_mapInfo.begin();

    for (iter; iter != m_mapInfo.end(); iter++)
    {
        QJsonObject userObj;
        /* 卡号 */
        QString cardId = iter.key();

        /* 用户信息 */
        User * tmpUsr = iter.value();

        userObj["cardId"] = cardId;
        userObj["username"] = tmpUsr->getUserName();
        userObj["hostelId"] = tmpUsr->getUserHostel();
        userObj["sex"] = tmpUsr->getUserSex();

        /* 添加到JsonArray中. */
        jsonArray.append(userObj);
    }

    QJsonDocument jsonDoc(jsonArray);

    /* 将Json数组里面的所有信息 全部保留在文件系统中. */
    /* 文件对象 */
    QFile file(m_userInfoPath);
    if (file.open(QIODevice::WriteOnly) == true)
    {
        file.write(jsonDoc.toJson());
        /* 关闭文件 */
        file.close();
    }
    else
    {
        QMessageBox::warning(this, "打开文件", "文件不存在");
    }
}

/* 关闭事件 */
void KaoQinSys::closeEvent(QCloseEvent *event)
{
    qDebug() << "closeEvent" << endl;

    /* 保存用户信息 */
    saveUserMapInfo();
}



/* 录入信息 - 槽函数 */
void KaoQinSys::handleEnterInfoSlot()
{
    ui->stackedWidget->setCurrentIndex(0);
}

/* 删除信息 - 槽函数 */
void KaoQinSys::handleDelInfoSlot()
{
    ui->stackedWidget->setCurrentIndex(1);
}

/* 查询信息 - 槽函数 */
void KaoQinSys::handleSearchInfoSlot()
{
    ui->stackedWidget->setCurrentIndex(2);
}

KaoQinSys::~KaoQinSys()
{
    delete ui;
}
